www.gusucode.com > VC 2D游戏编辑器-源码程序 > VC 2D游戏编辑器-源码程序/code/game_Source/GameLib/Graphics/drawInit.cpp

    //Download by http://www.NewXing.com
/////////////////
// drawInit.h	:	DDRAW初始化
//
// 版本0010		:	二零零三年七月四日
//
// written by	:	Huang LunXin
//
// Compiler		:	Visual C++ 6.0
//
// Copyright	:	IcePoint  2003
/////////////////
// 此文件用来初始化DDRAW
#include <ddraw.h>
#include "..\\define.h"
#include "draw_globle.h"
#include "..\\globle.h"
#include "..\\other_func.h"
#include "..\\globle_func.h"


bool InitDirectDraw()
{
	DDSURFACEDESC2 ddsd;
	ghRet=DirectDrawCreateEx(NULL,(void**)&lpDD,IID_IDirectDraw7,NULL);
    DD_ASSERT(ghRet,"CreateDirectDraw");

	ghRet=lpDD->SetCooperativeLevel(hwnd,DDSCL_NORMAL);
//	ghRet=lpDD->SetCooperativeLevel(hwnd,DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN|DDSCL_ALLOWREBOOT);
//	DD_ASSERT(ghRet,"Set Cooperative Level");

//	ghRet= lpDD->SetDisplayMode(SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_COLOR,0,0);
//	DD_ASSERT(ghRet,"Set Display Mode");
	DD_INIT(ddsd);
	ddsd.dwSize = sizeof( ddsd );

	ddsd.dwFlags = DDSD_CAPS;
	ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;

    ghRet = lpDD->CreateSurface( &ddsd, &DDS[SPrimary], NULL );
		
    DD_ASSERT(ghRet,"Create Primary");

	ddsd.dwSize = sizeof(ddsd);
	ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
	ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
	ddsd.dwWidth = SCREEN_WIDTH;
	ddsd.dwHeight = SCREEN_HEIGHT;

	ghRet = lpDD->CreateSurface( &ddsd, &DDS[SBuffer], NULL );

	DD_ASSERT(ghRet,"Create Buffer");

	ghRet = lpDD->CreateSurface( &ddsd, &DDS[SBack], NULL );
/*
	DD_ASSERT(ghRet,"Create Back");

	ghRet = lpDD->CreateSurface( &ddsd, &DDS[SBack1], NULL );

	DD_ASSERT(ghRet,"Create Back1");
	*/

	ddsd.dwWidth = SCREEN_WIDTH/32*32+64;
	ddsd.dwHeight = SCREEN_HEIGHT/32*32+64;

	ghRet = lpDD->CreateSurface( &ddsd, &DDS[SMap], NULL );

	DD_ASSERT(ghRet,"Create Map");

	ddsd.dwWidth = 3*32;
	ddsd.dwHeight = 3*32;

	ghRet = lpDD->CreateSurface( &ddsd, &DDS[SMapAlpha], NULL );

	DD_ASSERT(ghRet,"Create MapAlpha");

	ddsd.dwWidth = SCREEN_WIDTH>>3;
	ddsd.dwHeight = SCREEN_HEIGHT>>3;

	ghRet = lpDD->CreateSurface( &ddsd, &DDS[SGameImage], NULL );

	DD_ASSERT(ghRet,"Create SGameImage");


    DDPIXELFORMAT DDPixelFormat;
	DD_INIT(DDPixelFormat);
    ghRet= DDS[SPrimary]->GetPixelFormat(&DDPixelFormat);
	DD_ASSERT(ghRet,"Get Pixel Format");
	
	ghRet=DDS[SPrimary]->QueryInterface(IID_IDirectDrawGammaControl,(void**)&lpDDGammaControl);
	DD_ASSERT(ghRet,"Queuy Gamma Interface");

	ghRet=lpDDGammaControl->GetGammaRamp(0,&ddGammaStart);
	DD_ASSERT(ghRet,"Get Gamma Ramp");

	DDBLTFX ddBltFx;
	ddBltFx.dwSize=sizeof(DDBLTFX);
	ddBltFx.dwFillColor=0;
	DDS[SPrimary]->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);
	DDS[SBuffer]->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);
	DDS[SBack]->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);
//	DDS[SBack1]->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);

	if(SCREEN_COLOR == 32)
	{
		MsgBox("对不起,本游戏只支持16位真彩色,请将系统设为16位真彩色后在试一次!");
		PostQuitMessage(-1);
	}
	else
	{
		if(SCREEN_COLOR == 24)
		{
			MsgBox("对不起,本游戏只支持16位真彩色,请将系统设为16位真彩色后在试一次!");
			PostQuitMessage(-1);
		}
		else
		{
			if(SCREEN_COLOR == 16)
			{
				if((DDPixelFormat.dwGBitMask>>5)==0x1f)//00000011111
				{
					SetGamePixelFormat(555);
				}
				else 
				{
					if((DDPixelFormat.dwGBitMask>>5)==0x3f)//00000111111
					{
						SetGamePixelFormat(565);
					}
				}
			}
		}
	}

    return true;
}